<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>内置过滤器</title>
</head>
<body>
<!--字符串操作-->

{# 当变量为定义时，显示默认字符串，可以缩写为d #}
<p>{{ name|default('No name',true) }}</p>

{# 单词首字母大写 #}
<p>{{ 'hello'|capitalize }}</p>

{# 单词全小写 #}
<p>{{ 'XML'|lower }}</p>

{# 去除字符串前后的空白字符 #}
<p>{{ 'hello'|trim }}</p>

{# 字符串反转，返回"olleh" #}
<p>{{ 'hello'|reverse }}</p>

{# 格式化输出，返回"Number is 2" #}
<p>{{ '%s is %d'|format("Number",2) }}</p>

{# 关闭HTML自动转义 #}
<p>{{ '<em>name</em>'|safe }}</p>

{% autoescape false %}
{# HTML转义，即使autoescape关闭也转义，可以缩写为e #}
<p>{{ '<em>name</em>>'|escape }}</p>
{% endautoescape %}

<!--数值操作-->
{# 四舍五入取整，返回13.0 #}
<p>{{ 12.8888|round }}</p>

{# 向下截取到小数点后两位，返回12.88 #}
<p>{{ 12.8888|round(2,'floor') }}</p>

{# 绝对值，返回12 #}
<p>{{ 12.8888|abs }}</p>

<!--列表操作-->
{# 取第一个元素 #}
<p>{{ [1,2,3,4,5]|first }}</p>

{# 取最后一个元素 #}
<p>{{ [1,2,3,4,5]|last }}</p>

{# 返回列表长度，可以写为count #}
<p>{{ [1,2,3,4,5]|length }}</p>

{# 列表求和 #}
<p>{{ [1,2,3,4,5]|sum }}</p>

{# 列表排序，默认为升序 #}
<p>{{ [1,2,3,4,5]|sort }}</p>

{# 合并为字符串，返回"1|2|3|4|5" #}
<p>{{ [1,2,3,4,5]|join('|') }}</p>

{# 列表中所以元素都全大写，这里可以用upper，lower，但capitalize无效 #}
<p>{{ ['tom','bob','ada']|upper }}</p>

<!--字典操作-->
{% set users=[{'name':'Tom','gender':'M','age':20},
              {'name':'John','gender':'M','age':18},
              {'name':'Mary','gender':'F','age':24},
              {'name':'Bob','gender':'M','age':31}] %}
{# 按指定字段排序，这里设reverse为true使其按降序排列 #}
<ul>
    {% for user in users|sort(attribute='age',reverse=true) %}
    <li>{{ user.name }},{{ user.age }}</li>
    {% endfor %}
</ul>

{# 列表分组，每组是一个子列表，组名就是分组项的值 #}
<ul>
    {% for group in users|groupby('gender') %}
    <li>{{ group.grouper }}<ul>
        {% for user in group.list %}
        <li>{{ user.name }}
        </li>{% endfor %}
    </ul></li>
    {% endfor %}

    {# 列表分组，每组是一个子列表，组名就是分组项的值 #}
    <p>{{ user|map(attribute='name')|join(',') }}</p>
</ul>
</body>
</html>